$Description$
对一张$n$个点的图做$Q$次加边操作,每次给定$A_i,B_i,C_i,$然后按顺序连边$(A_i,B_i,C_i),(B_i,A_i+1,C_i+1),(A_i+1,B_i+1,C_i+2)$等等,求给定图的最小生成树$.(A_i,B_i,C_i$等点编号均为对$n$取模的意义下$)$给定初始的$n,q,A_i,B_i,C_i;$
$(N,Q\leqslant 200000,0\leqslant A_i,B_i<N,1\leqslant C_i\leqslant 10^9)$
$Solution$
经过简单思考,我们发现,对于一次加边操作,最多加入$2\times n$条边,因为第$2\times n+1$条边为$((A_i+n)\%n,((B_i+n)\%n,d+2\times n)$即$(A_i,B_i,d+2\times n),$由于求最小生成树,往后的边加入就没有意义了。
所以总边数为$N\times Q$,然而这个复杂度依然无法接受
对于一次连边,假设连$(A_i,B_i,C_i),$那么第二条边就要连$(B_i,A_i+1,C_i+1),$由于此时$A_i$和$B_i$已经联通$(B_i,A_i+1,C_i+1)$其实等价于$(A_i,A_i+1,C_i+1)$
于是我们可以发现,每次连边操作就相当于连$(A_i,B_i,C_i)$
$((A_i+d-1)\%n+1,(A_i+d)\%n+1,C_i+2\times d+1)$
$((B_i+d-1)\%n+1,(B_i+d)\%n+1,C_i+2\times d+2)(0\leqslant d<n)$
虽然这并没有改变每次加边$O(n)$的复杂度
但是我们发现$(A_i+1,A_i+2)$的边权等于$(A_i,A_i+1)$的边权$+2$
于是我们设一个数组$g,$使得$g[i]$表示$(i,i\%n+1)$这条边的最小边权$($开始时设为$inf),$接着对于一次连边我们连上$(A_i,B_i,C_i),$再将1
g[u]=min(g[u],d+1);g[v]=min(g[v],d+2);
然后我们只需要再用$g[i]$更新$g[i\%n+1]$即可,由于更新的节点顺序呈环形,所以需要更新两遍
1 | g[i%n+1]=min(g[i%n+1],g[i]+2); |
最后再连上$(i,i\%n+1,g[i])$就可以将将边数降低到$O(n)$级别,然后直接跑$Kruskal$即可
$Code$
1 |
|